﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{

    public class GerenciadorItem
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorItem()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorItem(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(ItemModel itemModel)
        {
            TB_ITEM itemE = new TB_ITEM();
            Atribuir(itemModel, itemE);
            unitOfWork.RepositorioItem.Inserir(itemE);
            unitOfWork.Commit(shared);
            return itemE.id_item;
        }


        public void Editar(ItemModel itemModel)
        {
            TB_ITEM itemE = new TB_ITEM();
            Atribuir(itemModel, itemE);
            unitOfWork.RepositorioItem.Editar(itemE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idItem)
        {
            unitOfWork.RepositorioItem.Remover(item => item.id_item.Equals(idItem));
            unitOfWork.Commit(shared);

        }

        private IQueryable<ItemModel> GetQuery()
        {
            IQueryable<TB_ITEM> tb_item = unitOfWork.RepositorioItem.GetQueryable();
            var query = from item in tb_item
                        orderby (item.descricao)
                        select new ItemModel
                        {
                            Id_Item = item.id_item,
                            Id_Venda = item.id_venda,
                            NomeEmpresa = item.TB_VENDA.TB_EMPRESA.nome,
                            NomeCliente = item.TB_VENDA.TB_CLIENTE.nome,
                            Status= item.TB_VENDA.TB_STATUS.descricao,
                            DataPedido = item.TB_VENDA.data_venda,
                            Id_Produto = item.id_produto,
                            valor = item.valor,
                            descricao = item.descricao,
                            quantidade = item.quantidade
                        };
            return query;
        }

        public IQueryable<ItemModel> ObterTodosByVenda(int id_venda)
        {
            return GetQuery().Where(item => item.Id_Venda.Equals(id_venda));
        }

        public IQueryable<ItemModel> ObterTodosItemVenda(List<VendaModel> venda)
        {
            List<ItemModel> ItemVenda = new List<ItemModel>();


	        for (int i = 0; i < venda.Count; i++) 
	        {
                int id = venda[i].Id_Venda;
                ItemVenda.AddRange(GetQuery().Where(item => item.Id_Venda.Equals(id)).ToList());
        	}

            return (ItemVenda).Select(x => x).AsQueryable();
            
        }


        public IEnumerable<ItemModel> ObterTodos()
        {
            return GetQuery();
        }

        public ItemModel Obter(int idItem)
        {
            IEnumerable<ItemModel> itemEs = GetQuery().Where(itemModel => itemModel.Id_Item.Equals(idItem));
            return itemEs.ElementAtOrDefault(0);
        }


        private void Atribuir(ItemModel itemModel, TB_ITEM itemE)
        {
            itemE.id_item = itemModel.Id_Item;
            itemE.id_produto = itemModel.Id_Produto;
            itemE.id_venda = itemModel.Id_Venda;
            itemE.valor = itemModel.valor;
            itemE.quantidade = itemModel.quantidade;
            itemE.descricao = itemModel.descricao;

        }
    }
}
